package com.example.back.utils;

import cn.hutool.core.bean.BeanUtil;
import com.example.back.dto.MenuTree;
import com.example.common.entity.Module;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import org.springframework.util.CollectionUtils;

import java.util.Collection;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @Author wxy
 * @Date 2021/1/14 13:56
 * @Version 1.0
 */
public final class LevelUtils {

    /**
     * 菜单层级循环
     *
     * @param list 原数据
     * @param sort 是否排序(null:不排序;true:desc排序:false:ase排序)
     * @return 分层数据
     */
    public static List<MenuTree> level(List<Module> list, Boolean sort) {
        if (CollectionUtils.isEmpty(list)) {
            return null;
        }
        Multimap<Long, Module> multimap = HashMultimap.create();
        list.forEach(c -> multimap.put(c.getPid(), c));
        Map<Long, Collection<Module>> map = multimap.asMap();
        //获取所有第一级
        List<MenuTree> data;
        if (null == sort) {
            data = map.get(0L)
                    .stream()
                    .map(m -> {
                        MenuTree menuTree = new MenuTree();
                        BeanUtil.copyProperties(m, menuTree);
                        //获取对应的第二级
                        List<MenuTree> l2 = map.get(m.getId())
                                .stream()
                                .map(mm -> {
                                    MenuTree menu = new MenuTree();
                                    BeanUtil.copyProperties(mm, menu);
                                    return menu;
                                }).collect(Collectors.toList());
                        if (!CollectionUtils.isEmpty(l2)) {
                            menuTree.setItem(l2);
                        }
                        return menuTree;
                    })
                    .collect(Collectors.toList());
        } else if (sort) {
            data = map.get(0L)
                    .stream()
                    .sorted(Comparator.comparing(Module::getSort).reversed())
                    .map(m -> {
                        MenuTree menuTree = new MenuTree();
                        BeanUtil.copyProperties(m, menuTree);
                        //获取对应的第二级
                        if (CollectionUtils.isEmpty(map.get(m.getId()))) {
                            return menuTree;
                        }
                        List<MenuTree> l2 = map.get(m.getId())
                                .stream()
                                .sorted(Comparator.comparing(Module::getSort).reversed())
                                .map(mm -> {
                                    MenuTree menu = new MenuTree();
                                    BeanUtil.copyProperties(mm, menu);
                                    return menu;
                                })
                                .collect(Collectors.toList());
                        menuTree.setItem(l2);
                        return menuTree;
                    })
                    .collect(Collectors.toList());
        } else {
            data = map.get(0L)
                    .stream()
                    .sorted(Comparator.comparing(Module::getSort))
                    .map(m -> {
                        MenuTree menuTree = new MenuTree();
                        BeanUtil.copyProperties(m, menuTree);
                        //获取对应的第二级
                        if (CollectionUtils.isEmpty(map.get(m.getId()))) {
                            return menuTree;
                        }
                        List<MenuTree> l2 = map.get(m.getId())
                                .stream()
                                .sorted(Comparator.comparing(Module::getSort))
                                .map(mm -> {
                                    MenuTree menu = new MenuTree();
                                    BeanUtil.copyProperties(mm, menu);
                                    return menu;
                                })
                                .collect(Collectors.toList());
                        menuTree.setItem(l2);
                        return menuTree;
                    })
                    .collect(Collectors.toList());
        }
        return data;
    }

}
